package com.example.flashlight;

import android.content.Context;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ToggleButton;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

public class MainActivity extends AppCompatActivity {

    private CameraManager cameraManager;
    private String cameraId;
    private boolean isFlashlightOn = false;
    private boolean isFlashing = false;
    private Handler handler = new Handler();
    private static final long FLASH_INTERVAL = 500;
    private int sosCounter = 0;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);

        cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
        try {
            cameraId = cameraManager.getCameraIdList()[0];
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }

        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });

        // Обработчик событий для кнопки включения/выключения фонарика
        ToggleButton toggleButtonFlashlight = findViewById(R.id.toggleButtonFlashlight);
        toggleButtonFlashlight.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {
                    turnOnFlashlight();
                } else {
                    turnOffFlashlight();
                }
            }
        });

        Button buttonFlashMode = findViewById(R.id.buttonFlashMode);
        buttonFlashMode.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                toggleFlashMode();
            }
        });

        Button buttonSOS = findViewById(R.id.buttonSOS);
        buttonSOS.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                handleSOS();
            }
        });
    }

    // Метод для включения фонарика
    private void turnOnFlashlight() {
        try {
            cameraManager.setTorchMode(cameraId, true);
            isFlashlightOn = true;
            updateFlashlightStatusText();
        } catch (CameraAccessException e) {
            e.printStackTrace();
            Toast.makeText(this, "Невозможно включить фонарик", Toast.LENGTH_SHORT).show();
        }
    }

    // Метод для выключения фонарика
    private void turnOffFlashlight() {
        try {
            cameraManager.setTorchMode(cameraId, false);
            isFlashlightOn = false;
            updateFlashlightStatusText();
        } catch (CameraAccessException e) {
            e.printStackTrace();
            Toast.makeText(this, "Невозможно выключить фонарик", Toast.LENGTH_SHORT).show();
        }
    }

    // Обновление текста состояния фонарика
    private void updateFlashlightStatusText() {
        TextView textViewStatus = findViewById(R.id.textViewStatus);
        if (isFlashlightOn) {
            textViewStatus.setText("Фонарик включен");
        } else {
            textViewStatus.setText("Фонарик выключен");
        }
    }

    // Метод для запуска мигания фонарика
    private void startFlashing() {
        handler.postDelayed(flashRunnable, FLASH_INTERVAL);
        isFlashing = true;
    }

    // Остановка мигания фонарика
    private void stopFlashing() {
        handler.removeCallbacks(flashRunnable);
        turnOffFlashlight(); // Фонарик выключается при остановке мигания
        isFlashing = false;
    }

    // Мигание фонарика с определенным интервалом
    private Runnable flashRunnable = new Runnable() {
        @Override
        public void run() {
            if (isFlashlightOn) {
                turnOffFlashlight();
            } else {
                turnOnFlashlight();
            }
            handler.postDelayed(this, FLASH_INTERVAL);
        }
    };

    // Переключения режима мигания
    private void toggleFlashMode() {
        if (isFlashlightOn) {
            turnOffFlashlight();
            stopFlashing();
        } else {
            // Если фонарик выключен, включаем мигание или выключаем его, в зависимости от состояния
            if (!isFlashing) {
                startFlashing();
            } else {
                stopFlashing();
            }
        }
    }

    private void handleSOS() {
        if (!isFlashing) {
            startSOS();
        }
    }

    private void startSOS() {
        isFlashing = true;
        sosCounter = 0;
        sosRunnable.run();
    }

    private Runnable sosRunnable = new Runnable() {
        @Override
        public void run() {
            switch (sosCounter) {
                case 0:
                    turnOnFlashlight();
                    handler.postDelayed(this, 3000);
                    break;
                case 1:
                    turnOffFlashlight();
                    handler.postDelayed(this, 1000);
                    break;
                case 2:
                    turnOnFlashlight();
                    handler.postDelayed(this, 1000);
                    break;
                case 3:
                    turnOffFlashlight();
                    handler.postDelayed(this, 1000);
                    break;
                case 4:
                    turnOnFlashlight();
                    handler.postDelayed(this, 3000);
                    break;
                case 5:
                    turnOffFlashlight();
                    sosCounter = 0;
                    break;
            }
            sosCounter++;
        }
    };

}
